package cn.edu.lcu.cs.javateaching.collection;

import java.util.HashSet;
import java.util.Random;
import java.util.Scanner;
import java.util.Set;

/**
 * 随机生成[low, high)之间不重复的若干个整数，并排序
 * 
 * @author ling
 *
 */
public class IntsGeneratorWithTreeSet {

	public static void main(String[] args) {
		int low = 0; // 左边边界
		int high = 0; // 右边界

		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入最小值：");
		low = scanner.nextInt();
		System.out.println("请输入最大值：");
		high = scanner.nextInt();

		// 因为去除了重复项，集合中保存的随机数的个数始终小于等于区间的长度
		int length = (high - low) / 3; // 生成区间长度的三分之一个随机数

		Set<Integer> intSet = buildRandomSet(low, high, length);
		intSet.forEach(System.out::println);

		// 生成流，排序，收集为列表
//		List<Integer> integers = intSet.stream().sorted().collect(Collectors.toList());

		// 也可以用Set直接生成列表
//		List<Integer> integers = new ArrayList<Integer>(intSet);
//		integers.sort(Integer::compareTo); // Lambda表达式，方法引用

//		System.out.println(integers);

	}

	/**
	 * 生成若干个 [low, high)间的不重复随机数
	 * 
	 * @param low
	 * @param high
	 * @return 保存随机数的集合
	 */
	private static Set<Integer> buildRandomSet(int low, int high, int length) {
		if (length > high - low) {
			throw new IllegalArgumentException("随机数个数大于区间长度");
		}
		// 生成的随机数保存到set里，自动去重复
		Set<Integer> ints = new HashSet<Integer>(); // Hash集合，无序
//		Set<Integer> ints = new TreeSet<Integer>(); // 二叉树集合，有序
		while (ints.size() < length) {
			int r = nextInt(low, high);
			ints.add(r); // 添加到集合Set中，自动去重复
		}
		return ints;
	}

	/**
	 * 随机生成[low, high)之间的整数，注意左边闭区间，右边开区间
	 * 
	 * @param low
	 * @param high
	 * @return
	 */
	private static int nextInt(int low, int high) {
		// 生成随机数，用当前时间作为种子
		Random random = new Random();

		if (low >= high) {
			throw new IllegalArgumentException("区间左边界应该小于右边界。当前区间为 [" + low + ", " + high + ")");
		}
		int r = random.nextInt(high - low); // [0, high-low)
		r += low; // [low, high)
		return r;
	}

}
